package com.mastercard.assets.web.forms.process;

import com.mastercard.assets.MasterCardException;
import com.mastercard.assets.flows.FlowUtil;
import com.mastercard.assets.flows.process.FlowProcessContext;
import com.mastercard.assets.flows.process.FlowProcessInit;
import com.mastercard.assets.flows.process.FlowProcessPost;
import com.mastercard.assets.flows.process.FlowProcessPrevious;
import com.mastercard.assets.flows.process.FlowProcessResult;
import com.mastercard.assets.flows.to.FlowCampaignTO;
import com.mastercard.assets.jpa.TblAsset;
import com.mastercard.assets.jpa.TblCampania;
import com.mastercard.assets.jpa.TblFlujo;
import com.mastercard.assets.jpa.TblForma;
import com.mastercard.assets.jpa.TblPreimplementacion;
import com.mastercard.assets.jpa.TblTarea;
import com.mastercard.assets.jpa.TblTareaPreimplementacion;
import com.mastercard.assets.notifications.NotificationUtil;
import com.mastercard.assets.util.MCUtil;
import com.mastercard.assets.util.dao.MasterCardDAO;
import com.mastercard.assets.web.struts.forms.FlowProcessForm;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts.upload.FormFile;

public class PreimplementationEntregaContratoFormProcess
implements 
        FlowProcessInit , 
		FlowProcessPrevious , 
		FlowProcessPost

{
    
    public FlowProcessResult loadFormData( FlowProcessContext ctx )
		throws
			MasterCardException
 {
                TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;//
		
		TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
		
		TblPreimplementacion tblPreimplementacion = tblTareaPreimplementacion.getTblPreimplementacion( ) ;//
                
                
                
		TblFlujo tblFlujo = tblPreimplementacion.getTblFlujo( ) ;//
		
		FlowCampaignTO to = new FlowCampaignTO( ) ;//
		
		to.setCveFlow( tblFlujo.getCveFlujo( ) ) ;//
		to.setFlow( tblFlujo ) ;//
		to.setTblTareaPreimplementacion( tblTareaPreimplementacion ) ;//
		to.setCampania( campania ) ;
                to.setWithFile( true ) ;
		
		// extrae la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;//
		
		// extrae la forma
		TblForma forma = tarea.getTblForma( ) ;//
		
		// nombre del jsp
		String jspName = forma.getArchivoForma( ) ;//
		// ruta completa del jsp
		URL ruta = null ;//   
                try
		{
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			ruta = new URL( "file" , "localhost" , MCUtil.getFormsDirToDisplay( ) + System.getProperty( "file.separator" ) + jspName ) ;
			
			System.out.println( "@@@@@@@@@@@@@@@@@@@" + ruta ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_OBTAINING_PATH , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.ErrorCalculatingPath" , e.getMessage( ) ) , e ) ;
		}
                

//		String jspPath = ruta.getQuery( ) ;
		String jspPath = "/WEB-INF/formas/" + jspName ;//
		
		System.out.println( "FlowUtil.java: jspPath/" + jspPath ) ;//
		
		java.util.List< TblAsset > assets = new ArrayList< TblAsset >( ) ;//
		java.util.List< TblAsset > assetsDelFlujo = tblPreimplementacion.getTblAssets( ) ;//
		
		// recorre assets
		for( TblAsset asset : assetsDelFlujo )//
			// en caso de que este activo
			if( asset.getStatus( ) == 1 )//
				assets.add( asset ) ;//
		
		// coloca en el to
		to.setAssets( assets ) ;//
		
		// abre el archivo
		File dir = new File( MCUtil.getFormsDir( ) ) ;
//		System.out.println( "***********" + dir.getAbsolutePath( ) ) ;
		File f = new File( dir , jspName ) ;
//		System.out.println( "***********" + f.getAbsolutePath( ) ) ;
		
//		System.getProperties( ).list( System.out ) ;
		
		String fileCode = "" ;
		StringBuffer sb = new StringBuffer( ) ;
                
                try
		{
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/" ) ;
			BufferedReader rIn = new BufferedReader( new FileReader( f ) ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/1" ) ;
			String line = "" ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/2" ) ;
			while( ( line = rIn.readLine( ) ) != null )
				sb.append( line ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/3" ) ;
			rIn.close( ) ;
			
			System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/4" ) ;
		}catch( Exception e )
		{
			e.printStackTrace( ) ;
			
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_NO_FORM_FILE_EXIST , MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.preimplementacion.NoFormFileExist" , jspName ) , e ) ;
		}
                
                System.out.println( "PreimplementationAbrirBCFormProcess.java: lecturaJSP/5" ) ;//                
//		System.out.println( sb.toString( ) ) ;
		
		// coloca la ruta del jsp
		to.setJspPath( jspPath ) ;
		to.setJspCode( sb.toString( ) ) ;
		
		sb.setLength( 0 ) ;
		sb = null ;
		
		System.out.println( "PreimplementationAbrirBCFormProcess.java: to/" + to ) ;
		System.out.println( "PreimplementationAbrirBCFormProcess.java: to.getError/" + to.getError( ) ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cvePreimplementacion/" + cvePreimplementacion ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cveAsset/" + cveAsset ) ;
//		System.out.println( "PreimplementationAbrirBCFormProcess.java: busca/cveFirstWork/" + cveFirstWork ) ;
			
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY , to ) ;
		
                
 }
    
    public FlowProcessResult canDisplay( FlowProcessContext ctx )
	{
		TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
		// en caso de uqe ya este ejecutado
		if( tblTareaPreimplementacion.getEjecutado( ) == 1 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_EXECUTED ) ;
		
		// toma las clases para procesar la forma antes de desplegarla
		// toma la tarea
		TblTarea tarea = tblTareaPreimplementacion.getTblTarea( ) ;
		
		String nombreTarea = tarea.getNombre( ) ;
		
		// en caso de que la tarea haya sido desactivada
		if( tarea.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_DESACTIVATED ) ;
		
		// toma la forma a la que esta ligada la tarea
		TblForma forma = tarea.getTblForma( ) ;
		
		// en caso de que la forma este desactivada
		if( forma.getStatus( ) == 0 )
			return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_WORK_FLOW_WORK_FORM_DESACTIVATED ) ;
		
		/// se pueden agregar mas filtros
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_CAN_DISPLAY ) ;
	}
    
    public FlowProcessResult processExit( FlowProcessContext ctx )
		throws
			MasterCardException
	{
		
                int stepupResult = -1 ;
                
                //primero el archivo
                TblTareaPreimplementacion tblTareaPreimplementacion = ctx.getTblTareaPreimplementacion( ) ;
		
                TblCampania campania = tblTareaPreimplementacion.getTblPreimplementacion( ).getTblCampania( ) ;
                
                FlowProcessForm forma = ( FlowProcessForm ) ctx.getUser( ).getAttribute( "FlowProcessForma" ) ;
                
                HttpServletRequest request = ctx.getRequest( ) ;
                
                String exit = forma.getExit( ) ;
                
                if ( exit.equals( "Enviar" ) )
                {                 
                    
                    // procesa los comentarios y el BC
                    // los guarda en BD
                    try
                    {                            
                            
                            StringBuffer sb = new StringBuffer( ) ;
                            
                            // toma los archivos
                            List< FormFile > files = new ArrayList< FormFile >( ) ; 
                            
                            FormFile contrato = forma.getArchivo01( ) ;
                            
                            files.add( forma.getArchivo01( ) ) ;
                            files.add( forma.getArchivo02( ) ) ;
                            files.add( forma.getArchivo03( ) ) ;
                            files.add( forma.getArchivo04( ) ) ;
                            files.add( forma.getArchivo05( ) ) ;
                            files.add( forma.getArchivo06( ) ) ;
                            files.add( forma.getArchivo07( ) ) ;
                            files.add( forma.getArchivo08( ) ) ;
                            files.add( forma.getArchivo09( ) ) ;
                            files.add( forma.getArchivo010( ) ) ;
                            files.add( forma.getArchivo011( ) ) ;
                            files.add( forma.getArchivo012( ) ) ;
                            files.add( forma.getArchivo013( ) ) ;
                            files.add( forma.getArchivo014( ) ) ;
                            files.add( forma.getArchivo015( ) ) ;
                            files.add( forma.getArchivo016( ) ) ;
                            files.add( forma.getArchivo017( ) ) ;
                            files.add( forma.getArchivo018( ) ) ;
                            files.add( forma.getArchivo019( ) ) ;
                            files.add( forma.getArchivo020( ) ) ;
                            files.add( forma.getArchivo021( ) ) ;
                            files.add( forma.getArchivo022( ) ) ;
                            files.add( forma.getArchivo023( ) ) ;
                            files.add( forma.getArchivo024( ) ) ;
                            files.add( forma.getArchivo025( ) ) ;
                            files.add( forma.getArchivo026( ) ) ;
                            files.add( forma.getArchivo027( ) ) ;
                            files.add( forma.getArchivo028( ) ) ;
                            files.add( forma.getArchivo029( ) ) ;
                            files.add( forma.getArchivo030( ) ) ;

                            // archivos en arreglo
                            List< FormFile > archivos = new ArrayList< FormFile >( ) ;

                            int index = 0 ;

                            for( FormFile f1 : files )
                            {
                                    System.out.println( "))) " + index + "-" + f1 + "-" + ( f1 == null || f1.getFileName( ).trim( ).length( ) == 0 || f1.getFileData( ) == null || f1.getFileData( ).length == 0 ) ) ;

                                    // en caso de que sea null o venga vacio
                                    if( f1 == null || f1.getFileName( ).trim( ).length( ) == 0 || f1.getFileData( ) == null || f1.getFileData( ).length == 0 )
                                            // siguiente
                                            continue ;

                                    // en caso de que si aplique, agrega
                                    archivos.add( f1 ) ;
                            }

                            // en caso 0 archivos
                            if( archivos.size( ) == 0 )
                                    sb.append( MCUtil.messages.getString( "com.mastercard.assets.web.errors.modules.flows.display.WorkFlowWorkFormErrorProcessingData.campaign.ThereIsNoFiles" ) + "\n" ) ;

                            if( sb.length( ) > 0 )
                            {
                                    String error = sb.toString( ) ;

                                    sb.setLength( 0 ) ;

                                    return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , error , null ) ;
                            }
                            
                        String filePath = MCUtil.extractContratoFileName( campania.getCveCampania() , contrato.getFileName() ) ;
			
			System.out.println( "Forma: " + campania.getCveCampania() + " - " + MCUtil.getConfProperty( MCUtil.CONF_PROPS_CONTRATO_DIR_PATH ) + filePath ) ;
			
			System.out.println( "Directorio de contrato: " + MCUtil.CONTRATO_DIR ) ;
                        
			File formFile = new File( MCUtil.getContratoDir( ) ) ;
			System.out.println( "Ruta de contrato: " + formFile.getAbsolutePath( ) ) ;
//			FileOutputStream out = new FileOutputStream(  formFile , false ) ;
                        FileOutputStream out = new FileOutputStream( new File( formFile , filePath ) ) ;
			out.write( contrato.getFileData( ) ) ;
			out.close( ) ;
                            
                           stepupResult = MasterCardDAO.processCampaignFlowSreen1B( ctx.getUser( ) , contrato , ctx.getTblTareaPreimplementacion( ) , ctx.getForm( ).getExit( ) ) ;
                           
                           MasterCardDAO.closeEntityManager( ) ;
                           return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS , stepupResult ) ;
                            
                    }catch( Exception e )
                    {
                        MasterCardDAO.closeEntityManager( ) ;
                            e.printStackTrace( ) ;
                            return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_ERROR_RELOAD , e.getMessage( ) , e ) ;
                    }
                    
                }
		
		
		return new FlowProcessResult( FlowUtil.FLOW_CONSTANTS_FORM_PROCESS_DATA_PROCESS_SUCCESS ) ;
	}
    
}
